class Observer {

    constructor() {
        /**消息队列，想当于调度中心**/
        this.message = {}
    }

    /**************************
     * 向消息队列里添加内容的函数$on
     * 即订阅者注册事件到调度中心
     * ************************/
    $on(type, callback) {
        // 判断有没有这个属性（事件类型）
        if (!this.message[type]) {
            // 如果没有这个属性，就初始化一个空的数组
            this.message[type] = [];
        }
        // 如果有这个属性，就往他的后面push一个新的callback
        this.message[type].push(callback)
    }

    /*********************
     * 删除消息队列里的内容
     * 即取消订阅
     * *******************/
    $off(type, callback) {
        // 判断是否有订阅消息，没有则return
        if (!this.message[type]) return;
        // 判断是否有callback参数
        if (!callback) {
            // 如果没有callback就删除事件
            this.message[type] = undefined;
        }
        this.message[type].filer = function (param) {
            return undefined;
        }
        //如果有callback，就只删掉callback消息
        this.message[type] = this.message[type].filer((item) => item !== callback);
    }

    /**********************
     * 触发消息队列里的内容
     * 取到event事件类型，根据event值去执行对应缓存列表中的函数
     * 即发布者发布事件到调度中心，调度中心处理代码
     * *********/
    $emit(type, callback) {
        // 判断是否有订阅
        if(!this.message[type]) return;
        //如果没有订阅，则对此事件进行轮询
       this.message[type].forEach(item =>{
            // 挨个执行每一个消息的回调函数callback
            item()
        });
    }
}


function handlerA() {
    console.log('handlerA');
}
function handlerB() {
    console.log('handlerB');
}
function handlerC() {
    console.log('handlerC');
}

// 使用构造函数创建一个实例
const person1 = new Observer();
//测试$on
person1.$on('buy', handlerA);
person1.$on('buy', handlerB);
person1.$on('buy', handlerC);
console.log('person1 :>> ', person1);
//测试$emit
person1.$emit('buy')
//测试$off
person1.$off('buy',handlerC);
console.log('person1 :>> ', person1);
person1.$off('buy');
console.log('person1 :>> ', person1);

